AWS Glueデータカタログへのテーブルの作成とAthenaの設定をCloudFormationでやってみた
こんにちは、CX事業本部の若槻です。
前回の以下記事では、AWS Glueデータカタログへのテーブルの作成とAthenaの設定をAWS CLIで行いました。
今回は、前回と同様の環境の構築をCloudFormationでやってみました。
やってみた
スタックテンプレート
CloudFormationスタックのテンプレートは以下となります。リソース名などを除き、これにより作成されるリソースのプロパティは前回と同じとなります。
% touch template.yml
AWSTemplateFormatVersion: '2010-09-09' Parameters: Env: Type: String Resources: RawDataBucket: Type: AWS::S3::Bucket Properties: BucketName: !Sub raw-data-${AWS::AccountId}-${AWS::Region}-${Env} GlueDatabase: Type: AWS::Glue::Database Properties: CatalogId: !Ref AWS::AccountId DatabaseInput: Name: !Sub glue-database-${Env} GlueTable: Type: AWS::Glue::Table Properties: CatalogId: !Ref AWS::AccountId DatabaseName: !Ref GlueDatabase TableInput: Name: !Sub glue-table-${Env} TableType: EXTERNAL_TABLE Parameters: skip.header.line.count: 1 has_encrypted_data: false serialization.encoding: utf-8 EXTERNAL: true StorageDescriptor: OutputFormat: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat Columns: - Name: rank Type: int - Name: name Type: string - Name: type Type: string InputFormat: org.apache.hadoop.mapred.TextInputFormat Location: !Sub s3://${RawDataBucket}/data SerdeInfo: Parameters: field.delim: "," serialization.format: "," SerializationLibrary: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe AthenaQueryResultBucket: Type: AWS::S3::Bucket Properties: BucketName: !Sub query-result-${AWS::AccountId}-${AWS::Region}-${Env} AthenaWorkGroup: Type: AWS::Athena::WorkGroup Properties: Name: !Sub athena-work-group-${Env} WorkGroupConfiguration: ResultConfiguration: OutputLocation: !Sub s3://${AthenaQueryResultBucket}/data EnforceWorkGroupConfiguration: true PublishCloudWatchMetricsEnabled: true
テンプレート内では以下の5リソースを定義しています。
RawDataBucket
:Glueのクロール対象のS3バケットGlueDatabase
:GlueデータベースGlueTable
:Glueがクロールしたデータを登録するデータカタログAthenaQueryResultBucket
:Athenaでのクエリ実行結果の保存先バケットAthenaWorkGroup
:Athenaのワークグループ
スタックのデプロイ
% Env=dev % aws cloudformation deploy \ --template-file template.yml \ --stack-name sample-analytyis-stack-${Env} \ --capabilities CAPABILITY_NAMED_IAM \ --no-fail-on-empty-changeset \ --parameter-overrides Env=${Env}
下記のように結果出力されればデプロイは成功です。
Waiting for changeset to be created.. Waiting for stack create/update to complete Successfully created/updated stack - sample-analytyis-stack-dev
Athenaのクエリ実行によるデータ取得
デプロイした環境を利用して、Athenaのクエリ実行によるデータ取得をしてみます。
データ準備
% touch data.csv
rank,name,type 1,hojo,Co 2,sagisawa,Co 3,ichinose,Cu 4,kamiya,Co 5,takagaki,Co
% aws s3 cp data.csv s3://<bucket-name>/data/data.csv
クエリ実行
% aws athena start-query-execution \ --query-string 'SELECT * FROM "glue-database-dev"."glue-table-dev" limit 10' \ --work-group athena-work-group-${Env}
{ "QueryExecutionId": "5c3824ab-6b92-454b-99af-2cc94591b2a6" }
クエリ実行結果取得
% aws athena get-query-results --query-execution-id 5c3824ab-6b92-454b-99af-2cc94591b2a6
{ "ResultSet": { "Rows": [ { "Data": [ { "VarCharValue": "rank" }, { "VarCharValue": "name" }, { "VarCharValue": "attribute" } ] }, { "Data": [ { "VarCharValue": "1" }, { "VarCharValue": "hojo" }, { "VarCharValue": "Co" } ] }, { "Data": [ { "VarCharValue": "2" }, { "VarCharValue": "sagisawa" }, { "VarCharValue": "Co" } ] }, { "Data": [ { "VarCharValue": "3" }, { "VarCharValue": "ichinose" }, { "VarCharValue": "Cu" } ] }, { "Data": [ { "VarCharValue": "4" }, { "VarCharValue": "kamiya" }, { "VarCharValue": "Co" } ] }, { "Data": [ { "VarCharValue": "5" }, { "VarCharValue": "takagaki" }, { "VarCharValue": "Co" } ] } ], "ResultSetMetadata": <略> }, "UpdateCount": 0 }
Athenaのクエリ実行によるデータ取得ができました。
おわりに
AWS Glueデータカタログへのテーブルの作成とAthenaの設定をCloudFormationでやってみました。
CloudFormationを使うことによってリソースの構成管理ができるようになるのは嬉しいですね。
参考
- AWS::S3::Bucket - AWS CloudFormation
- AWS CloudFormation テンプレートを使用したデータカタログの事前設定 - AWS Glue
- AWS Glueデータカタログへのテーブルの作成とAthenaでのクエリ実行をAWS CLIでやってみた | Developers.IO
- AWS::Glue::Database - AWS CloudFormation
以上